<?php

namespace MarketServer\Model;

/**
 * 通用事件日志数据库模型
 *
 * @since 1.0.0 <2015-4-14> SoChishun <14507247@qq.com> Added.
 */
class LogModel extends AppbaseModel {

    // 禁止字段检测
    protected $autoCheckFields = false;

    /**
     * 事件动作-新增
     */
    const ACTION_ADD = 'ADD';

    /**
     * 事件动作-编辑
     */
    const ACTION_EDIT = 'EDIT';

    /**
     * 事件动作-删除
     */
    const ACTION_DELETE = 'DELETE';

    /**
     * 事件动作-查询
     */
    const ACTION_SEARCH = 'SEARCH';

    /**
     * 事件对象-存储过程
     */
    const OBJECT_PROC = 'PROC';

    /**
     * 事件对象-函数
     */
    const OBJECT_FUNC = 'FUNC';

    /**
     * 事件对象-数据表
     */
    const OBJECT_TABEL = 'TABEL';

    /**
     * 事件对象-视图
     */
    const OBJECT_VIEW = 'VIEW';

    /**
     * 事件对象-页面
     */
    const OBJECT_PAGE = 'PAGE';

    /**
     * 事件级别-信息
     */
    const LEVEL_INFO = 'INFO';

    /**
     * 事件级别-错误
     */
    const LEVEL_ERROR = 'ERROR';

    /**
     * 事件级别-调试
     */
    const LEVEL_DEBUG = 'DEBUG';

    /**
     * 事件级别-警告
     */
    const LEVEL_WARINIG = 'WARNING';

    /**
     * 事件级别-攻击
     */
    const LEVEL_ATTACK = 'ATTACK';

    /**
     * 记录用户登录日志
     * @param boolean $status 登录状态
     * @param string $user_name 登录名
     * @param @string $remark 消息, 如:sprintf('uname=%s, pwd=%s, ...',);
     * @param @bool $is_login 是否登入
     * @since 1.0 <2015-6-10> SoChishun Added.
     * @since 1.1 <2015-8-6> SoChishun 重新组织参数,取消user_id参数
     * @example 
     *      1.登入: D('Log')->log_user_login(true, $user_name, sprintf('uname=%s, pwd=%s 登录成功', $user_name, $pwd));
     *      2.登出：D('Log')->log_user_login(true, $login_data['user_name'], sprintf('uname=%s 注销成功', $login_data['user_name']), false);
     */
    public function log_user_login($status, $user_name, $remark = '', $is_login = true) {
        $data = array(
            'user_name' => $user_name,
            'ip' => get_client_ip(),
            'status' => intval($status),
            'is_login' => $is_login,
            'remark' => $remark,
        );
        $this->table(sofn_get_sharding_field('DB_LOG') . 'tlog_user_login')->add($data);
    }

    /**
     * 记录用户操作日志
     * @param mixed $status 事件状态(1=成功,4=失败)
     * @param string $user_name 用户名
     * @param array $options 选项
     * <br />[string]admin_name 操作员名称
     * <br />[string]desc // 描述(如:充值100元),占位符{%}可自动转为字串"成功"或"失败"
     * <br />[string]action // 事件动作(如:充值、查询、登录、新增、编辑、删除)
     * <br />[string]level // 事件级别(如:信息、错误、警告、攻击、调试)
     * @since 1.0 <2015-6-10> SoChishun Added.
     * @since 1.1 <2015-8-6> SoChishun 将参数改为$options数组参数,user_id改为user_name,新增admin_name
     * @example D('Log')->log_user_operate(false, $this->data['user_name'], array(
            'admin_name' => $admin_name,
            'desc' => sprintf('%s管理员账户%s user=%s, site_id=%d', ($is_edit ? '编辑' : '新增'), '{%}', $data['user_name'], $data['site_id']),
            'action' => ($is_edit ? LogModel::ACTION_EDIT : LogModel::ACTION_ADD),
            'level' => LogModel::LEVEL_INFO,
        ));
     */
    public function log_user_operate($status, $user_name, $options = array()) {
        $data = array(
            'user_name' => $user_name,
            'admin_name' => '',
            'ip' => get_client_ip(),
            'action' => '', // 事件动作(如:充值、查询、登录、新增、编辑、删除)
            'object' => '', // 事件对象(如:存储过程、表名、视图名、页面)
            'source' => $_SERVER['REQUEST_URI'], // 事件来源(如:网址,PROCEDURE)
            'level' => static::LEVEL_INFO, // 事件级别(如:信息、错误、警告、攻击、调试)
            'desc' => '', // 描述(如:充值100元)
            'status' => intval($status), // 事件状态(1=成功,4=失败)
        );
        $keys = array_keys($data);
        foreach ($keys as $key) {
            if (isset($options[$key])) {
                $data[$key] = $options[$key];
            }
        }
        $desc = $data['desc'];
        if (false !== strpos($desc, '{%}')) {
            $data['desc'] = str_replace('{%}', $status ? '成功' : '失败', $desc);
        }

        $this->table(sofn_get_sharding_field('DB_LOG') . 'tlog_user_operate')->add($data);
    }

}
